home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 July: Mac OS SDK / Dev.CD Jul 96 SDK / Dev.CD Jul 96 SDK1.toast / Development Kits (Disc 1) / Apple Game Sprockets / Examples / SoundSprocketTest / TS3TestHiLevel.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-05-16  |  65.1 KB  |  2,516 lines  |  [TEXT/CWIE]

  1. /*
  2.  *    File:        TS3TestHiLevel.c
  3.  *    Author:        Dan Venolia
  4.  *
  5.  *    Copyright © 1996 Apple Computer, Inc.
  6.  */
  7.  
  8. #include <assert.h>
  9. #include <math.h>
  10. #include <string.h>
  11.  
  12. #include <Dialogs.h>
  13. #include <Fonts.h>
  14. #include <Menus.h>
  15. #include <Timer.h>
  16.  
  17. #include <QD3D.h>
  18. #include <QD3DMath.h>
  19.  
  20. #include "TS3Menu.h"
  21. #include "TS3Message.h"
  22. #include "TS3Resource.h"
  23. #include "TS3Sound.h"
  24. #include "TS3TestHiLevel.h"
  25. #include "TS3Utils.h"
  26. #include "TS3Window.h"
  27.  
  28. #include "SoundSprocket.h"
  29.  
  30.  
  31. typedef struct TTestHiLevelData {
  32.     float            duration;
  33.     
  34.     TQ3Vector3D        listenerTranslate1;
  35.     TQ3Vector3D        listenerTranslate2;
  36.     Boolean            listenerTranslateRange;
  37.     
  38.     TQ3Vector3D        listenerRotationAxis1;
  39.     TQ3Vector3D        listenerRotationAxis2;
  40.     Boolean            listenerRotationAxisRange;
  41.     
  42.     float            listenerRotationAngle1;
  43.     float            listenerRotationAngle2;
  44.     Boolean            listenerRotationAngleRange;
  45.     
  46.     TQ3Vector3D        listenerScale1;
  47.     TQ3Vector3D        listenerScale2;
  48.     Boolean            listenerScaleRange;
  49.     
  50.     TQ3Vector3D        listenerPosition1;
  51.     TQ3Vector3D        listenerPosition2;
  52.     Boolean            listenerPositionRange;
  53.     
  54.     TQ3Vector3D        listenerOrientation1;
  55.     TQ3Vector3D        listenerOrientation2;
  56.     Boolean            listenerOrientationRange;
  57.     
  58.     TQ3Vector3D        listenerUpVector1;
  59.     TQ3Vector3D        listenerUpVector2;
  60.     Boolean            listenerUpVectorRange;
  61.     
  62.     TQ3Vector3D        listenerVelocity1;
  63.     TQ3Vector3D        listenerVelocity2;
  64.     Boolean            listenerVelocityRange;
  65.     
  66.     UInt32            medium;
  67.     
  68.     float            humidity1;
  69.     float            humidity2;
  70.     Boolean            humidityRange;
  71.     
  72.     float            roomSize1;
  73.     float            roomSize2;
  74.     Boolean            roomSizeRange;
  75.     
  76.     float            roomReflectivity1;
  77.     float            roomReflectivity2;
  78.     Boolean            roomReflectivityRange;
  79.     
  80.     float            reverbAttenuation1;
  81.     float            reverbAttenuation2;
  82.     Boolean            reverbAttenuationRange;
  83.     
  84.     UInt32            cpuLoad1;
  85.     UInt32            cpuLoad2;
  86.     Boolean            cpuLoadRange;
  87.     
  88.     TQ3Vector3D        sourceTranslate1;
  89.     TQ3Vector3D        sourceTranslate2;
  90.     Boolean            sourceTranslateRange;
  91.     
  92.     TQ3Vector3D        sourceRotationAxis1;
  93.     TQ3Vector3D        sourceRotationAxis2;
  94.     Boolean            sourceRotationAxisRange;
  95.     
  96.     float            sourceRotationAngle1;
  97.     float            sourceRotationAngle2;
  98.     Boolean            sourceRotationAngleRange;
  99.     
  100.     TQ3Vector3D        sourceScale1;
  101.     TQ3Vector3D        sourceScale2;
  102.     Boolean            sourceScaleRange;
  103.     
  104.     TQ3Vector3D        sourcePosition1;
  105.     TQ3Vector3D        sourcePosition2;
  106.     Boolean            sourcePositionRange;
  107.     
  108.     TQ3Vector3D        sourceOrientation1;
  109.     TQ3Vector3D        sourceOrientation2;
  110.     Boolean            sourceOrientationRange;
  111.     
  112.     TQ3Vector3D        sourceUpVector1;
  113.     TQ3Vector3D        sourceUpVector2;
  114.     Boolean            sourceUpVectorRange;
  115.     
  116.     TQ3Vector3D        sourceVelocity1;
  117.     TQ3Vector3D        sourceVelocity2;
  118.     Boolean            sourceVelocityRange;
  119.     
  120.     UInt32            sourceMode;
  121.     
  122.     float            referenceDistance1;
  123.     float            referenceDistance2;
  124.     Boolean            referenceDistanceRange;
  125.     
  126.     float            length1;
  127.     float            length2;
  128.     Boolean            lengthRange;
  129.     
  130.     float            width1;
  131.     float            width2;
  132.     Boolean            widthRange;
  133.     
  134.     float            height1;
  135.     float            height2;
  136.     Boolean            heightRange;
  137.     
  138.     float            coneAngleDeg1;
  139.     float            coneAngleDeg2;
  140.     Boolean            coneAngleDegRange;
  141.     
  142.     float            coneAttenuation1;
  143.     float            coneAttenuation2;
  144.     Boolean            coneAttenuationRange;
  145.     
  146.     float            coneAngleCos1;
  147.     float            coneAngleCos2;
  148. } TTestHiLevelData;
  149.  
  150.  
  151. static MenuHandle                gTestHiLevelPresetMenu            = NULL;
  152. static DialogPtr                gTestHiLevelDialog                = NULL;
  153. static UserItemUPP                gTestHiLevelProgressUserItem    = NULL;
  154. static UInt32                    gTestHiLevelCPULoadLimit;
  155. static TTestHiLevelData            gTestHiLevelData;
  156. static Boolean                    gTestHiLevelUpdate                = true;
  157. static SSpListenerReference        gTestHiLevelListener            = NULL;
  158. static SSpSourceReference        gTestHiLevelSource                = NULL;
  159.  
  160. static UnsignedWide                gTestHiLevelCycleStart;
  161. static float                    gTestHiLevelInterpolant            = 0.0;
  162.  
  163. static TQ3Vector3D                gTestHiLevelListenerActual        = {-1.23456, -1.23456, -1.23456};
  164. static TQ3Vector3D                gTestHiLevelSourceActual        = {-1.23456, -1.23456, -1.23456};
  165.  
  166.  
  167. static WindowMethodPtr TestHiLevel_MetaHandler(
  168.     WindowMethod        inMethod);
  169.  
  170. static void TestHiLevel_GetSleep(
  171.     WindowPtr            inWindow,
  172.     UInt32*                outSleep);
  173.  
  174. static void TestHiLevel_ConsumeEvent(
  175.     WindowPtr            inWindow,
  176.     const EventRecord*    inEvent,
  177.     Boolean*            outConsumed);
  178.  
  179. static void TestHiLevel_Update(
  180.     WindowPtr            inWindow);
  181.  
  182. static void TestHiLevel_Activate(
  183.     WindowPtr            inWindow);
  184.  
  185. static void TestHiLevel_Deactivate(
  186.     WindowPtr            inWindow);
  187.  
  188. static pascal void TestHiLevel_ProgressUserItem(
  189.     DialogPtr            inDialog,
  190.     short                inItem);
  191.  
  192. static void TestHiLevel_Interpolate(
  193.     void);
  194.  
  195. static float TestHiLevel_InterpolateFloat(
  196.     float                inWhere,
  197.     float                inVal0,
  198.     float                inVal1,
  199.     Boolean                inIsRange);
  200.  
  201. static void TestHiLevel_InterpolateVector3D(
  202.     float                inWhere,
  203.     const TQ3Vector3D*    inVal0,
  204.     const TQ3Vector3D*    inVal1,
  205.     Boolean                inIsRange,
  206.     TQ3Vector3D*        outResult);
  207.  
  208. static void TestHiLevel_InterpolateNormalVector3D(
  209.     float                inWhere,
  210.     const TQ3Vector3D*    inVal0,
  211.     const TQ3Vector3D*    inVal1,
  212.     Boolean                inIsRange,
  213.     TQ3Vector3D*        outResult);
  214.  
  215. static void TestHiLevel_DeriveData(
  216.     void);
  217.  
  218. static void TestHiLevel_SetDialogFields(
  219.     void);
  220.  
  221. static void TestHiLevel_GetDialogFields(
  222.     void);
  223.  
  224.  
  225. /* =============================================================================
  226.  *        TestHiLevel_Init (external)
  227.  *
  228.  *    Initializes our thing.
  229.  * ========================================================================== */
  230. void TestHiLevel_Init(
  231.     void)
  232. {
  233.     OSStatus            err;
  234.     TEHandle            textEdit;
  235.     FontInfo            fontInfo;
  236.     short                itemType;
  237.     Handle                itemHandle;
  238.     Rect                itemBounds;
  239.     Str255                str;
  240.     
  241.     // Make sure we didn't mess up the dialog items
  242.     assert(kHiLevelItem_COUNT == kHiLevelItem_ExpectedCOUNT);
  243.     
  244.     // Grab the maximum CPU load limit value
  245.     gTestHiLevelCPULoadLimit = 999;
  246.     err = SSpGetCPULoadLimit(&gTestHiLevelCPULoadLimit);
  247.     Message_CheckError(err, "TestHiLevel_Init", "SSpGetCPULoadLimit");
  248.     
  249.     //• TODO: Read in gTestHiLevelData from preferences
  250.     
  251.     // Set up our listener and source
  252.     err = SSpListener_New(&gTestHiLevelListener);
  253.     Message_CheckError(err, "TestHiLevel_Init", "SSpListener_New");
  254.     
  255.     assert(gTestHiLevelListener != NULL);
  256.     
  257.     err = SSpSource_New(&gTestHiLevelSource);
  258.     Message_CheckError(err, "TestHiLevel_Init", "SSpSource_New");
  259.     
  260.     assert(gTestHiLevelSource != NULL);
  261.     
  262.     // Grab the menu
  263.     gTestHiLevelPresetMenu = GetMenu(kMenuID_HiLevelPreset);
  264.     
  265.     // Grab the dialog
  266.     gTestHiLevelDialog = GetNewDialog(kDlogID_HiLevel, NULL, (WindowPtr) -1);
  267.     assert(gTestHiLevelDialog != NULL);
  268.     
  269.     SetPort(gTestHiLevelDialog);
  270.     TextFont(geneva);
  271.     TextSize(10);
  272.     
  273.     // Fix up the line height
  274.     GetFontInfo(&fontInfo);
  275.     
  276.     textEdit = ((DialogPeek) gTestHiLevelDialog)->textH;
  277.     
  278.     (*textEdit)->lineHeight = fontInfo.ascent+fontInfo.descent+fontInfo.leading;
  279.     (*textEdit)->fontAscent = fontInfo.ascent;
  280.     
  281.     // Set up our method table
  282.     Window_New(gTestHiLevelDialog, TestHiLevel_MetaHandler);
  283.     
  284.     // Do the user items
  285.     GetDialogItem(gTestHiLevelDialog, kHiLevelItem_UpdateHilite, &itemType, &itemHandle, &itemBounds);
  286.     SetDialogItem(gTestHiLevelDialog, kHiLevelItem_UpdateHilite, itemType, (Handle) Utils_GetOKUserItemProc(), &itemBounds);
  287.     
  288.     gTestHiLevelProgressUserItem = NewUserItemProc(TestHiLevel_ProgressUserItem);
  289.     assert(gTestHiLevelProgressUserItem != NULL);
  290.     
  291.     GetDialogItem(gTestHiLevelDialog, kHiLevelItem_Progress, &itemType, &itemHandle, &itemBounds);
  292.     SetDialogItem(gTestHiLevelDialog, kHiLevelItem_Progress, itemType, (Handle) gTestHiLevelProgressUserItem, &itemBounds);
  293.     
  294.     // Show the quality limit
  295.     sprintf((char*) str, "x[0..%ld]", gTestHiLevelCPULoadLimit);
  296.     str[0] = strlen((char*) str)-1;
  297.     
  298.     GetDialogItem(gTestHiLevelDialog, kHiLevelItem_CPULoadUnits, &itemType, &itemHandle, &itemBounds);
  299.     SetDialogItemText(itemHandle, str);
  300.     
  301.     // Set the initial field values
  302.     TestHiLevel_Preset(1);
  303.     
  304.     // Select the first field
  305.     SelectDialogItemText(gTestHiLevelDialog, kHiLevelItem_Duration, 0, 32767);
  306.     
  307.     // Show the dialog
  308.     ShowWindow(gTestHiLevelDialog);
  309.     
  310.     // Initialize our cycle timer
  311.     Microseconds(&gTestHiLevelCycleStart);
  312. }
  313.  
  314.  
  315. /* =============================================================================
  316.  *        TestHiLevel_Exit (external)
  317.  *
  318.  *    Cleans up.
  319.  * ========================================================================== */
  320. void TestHiLevel_Exit(
  321.     void)
  322. {
  323.     //• TODO: Save gTestHiLevel to preferences
  324.     
  325.     if (gTestHiLevelDialog != NULL)
  326.     {
  327.         DisposeDialog(gTestHiLevelDialog);
  328.         gTestHiLevelDialog = NULL;
  329.     }
  330.     
  331.     if (gTestHiLevelProgressUserItem != NULL)
  332.     {
  333.         DisposeRoutineDescriptor(gTestHiLevelProgressUserItem);
  334.         gTestHiLevelProgressUserItem = NULL;
  335.     }
  336.     
  337.     if (gTestHiLevelListener != NULL)
  338.     {
  339.         SSpListener_Dispose(gTestHiLevelListener);
  340.         gTestHiLevelListener = NULL;
  341.     }
  342.     
  343.     if (gTestHiLevelSource != NULL)
  344.     {
  345.         SSpSource_Dispose(gTestHiLevelSource);
  346.         gTestHiLevelSource = NULL;
  347.     }
  348. }
  349.  
  350.  
  351. /* =============================================================================
  352.  *        TestHiLevel_MetaHandler (internal)
  353.  *
  354.  *    Returns the method function pointer that corresponds to the given ID.
  355.  * ========================================================================== */
  356. WindowMethodPtr TestHiLevel_MetaHandler(
  357.     WindowMethod        inMethod)
  358. {
  359.     WindowMethodPtr        result;
  360.     
  361.     result = NULL;
  362.     
  363.     switch (inMethod)
  364.     {
  365.         case kWindowMethod_GetSleep:
  366.             result = (WindowMethodPtr) TestHiLevel_GetSleep;
  367.         break;
  368.         
  369.         case kWindowMethod_ConsumeEvent:
  370.             result = (WindowMethodPtr) TestHiLevel_ConsumeEvent;
  371.         break;
  372.         
  373.         case kWindowMethod_Update:
  374.             result = (WindowMethodPtr) TestHiLevel_Update;
  375.         break;
  376.         
  377.         case kWindowMethod_Activate:
  378.             result = (WindowMethodPtr) TestHiLevel_Activate;
  379.         break;
  380.         
  381.         case kWindowMethod_Deactivate:
  382.             result = (WindowMethodPtr) TestHiLevel_Deactivate;
  383.         break;
  384.     }
  385.     
  386.     return result;
  387. }
  388.  
  389.  
  390. /* =============================================================================
  391.  *        TestHiLevel_GetSleep (internal)
  392.  *
  393.  *    Returns the sleep time to pass to WaitNextEvent when we're in front.
  394.  * ========================================================================== */
  395. void TestHiLevel_GetSleep(
  396.     WindowPtr            inWindow,
  397.     UInt32*                outSleep)
  398. {
  399.     assert(outSleep != NULL);
  400.     
  401.     *outSleep = 0;
  402. }
  403.  
  404.  
  405. /* =============================================================================
  406.  *        TestHiLevel_ConsumeEvent (internal)
  407.  *
  408.  *    Called for each event when this is the front window.
  409.  * ========================================================================== */
  410. void TestHiLevel_ConsumeEvent(
  411.     WindowPtr            inWindow,
  412.     const EventRecord*    inEvent,
  413.     Boolean*            outConsumed)
  414. {
  415.     short                itemType;
  416.     Handle                itemHandle;
  417.     Rect                itemBounds;
  418.     ControlHandle        updateButton;
  419.     Boolean                consumed;
  420.     Boolean                passToDialog;
  421.     WindowPtr            window;
  422.     short                item;
  423.     unsigned long        timeout;
  424.     UnsignedWide        now;
  425.     
  426.     assert(inEvent != NULL);
  427.     assert(outConsumed != NULL);
  428.     
  429.     consumed = false;
  430.     passToDialog = true;
  431.     
  432.     // We want to handle some events ourself
  433.     switch (inEvent->what)
  434.     {
  435.         case keyDown:
  436.         case autoKey:
  437.             passToDialog = false;
  438.             
  439.             if (inEvent->modifiers & cmdKey)
  440.             {
  441.                 if (inEvent->what != autoKey)
  442.                 {
  443.                     switch (inEvent->message & charCodeMask)
  444.                     {
  445.                         case '.':
  446.                             // anything here?
  447.                         break;
  448.                     }
  449.                 }
  450.             }
  451.             else
  452.             {
  453.                 switch (inEvent->message & charCodeMask)
  454.                 {
  455.                     case 0x08:  // backspace
  456.                     case 0x09:  // tab
  457.                     case 0x1C:  // cursor left
  458.                     case 0x1D:  // cursor right
  459.                     case 0x1E:  // cursor up
  460.                     case 0x1F:  // cursor down
  461.                     case ' ':
  462.                     case '.':
  463.                     case '-':
  464.                     case '0':
  465.                     case '1':
  466.                     case '2':
  467.                     case '3':
  468.                     case '4':
  469.                     case '5':
  470.                     case '6':
  471.                     case '7':
  472.                     case '8':
  473.                     case '9':
  474.                         // Pass it to the dialog
  475.                         passToDialog = true;
  476.                     break;
  477.                     
  478.                     case 0x03:  // enter
  479.                     case 0x0D:  // return
  480.                         if (inEvent->what != autoKey)
  481.                         {
  482.                             // Update button equivalent
  483.                             GetDialogItem(gTestHiLevelDialog, kHiLevelItem_Update, &itemType, &itemHandle, &itemBounds);
  484.                             updateButton = (ControlHandle) itemHandle;
  485.                             
  486.                             if ((*updateButton)->contrlHilite == 0)
  487.                             {
  488.                                 HiliteControl(updateButton, 1);
  489.                                 
  490.                                 timeout = TickCount()+6;
  491.                                 while (TickCount() < timeout) /* wait */;
  492.                                 
  493.                                 HiliteControl(updateButton, 0);
  494.                                 
  495.                                 TestHiLevel_GetDialogFields();
  496.                                 
  497.                                 consumed = true;
  498.                             }
  499.                         }
  500.                     break;
  501.                     
  502.                     default:
  503.                         SysBeep(10);
  504.                         consumed = true;
  505.                 }
  506.             }
  507.         break;
  508.         
  509.         case activateEvt:
  510.             // We need to look at the activate event here because it is
  511.             // consumed by IsDialogEvent/DialogSelect below and so never
  512.             // gets to the window stuff
  513.             window = (WindowPtr) inEvent->message;
  514.             
  515.             if (inEvent->modifiers & activeFlag)
  516.             {
  517.                 Window_Activate(window);
  518.             }
  519.             else
  520.             {
  521.                 Window_Deactivate(window);
  522.             }
  523.         break;
  524.         
  525.         case nullEvent:
  526.             // Find where we are in the cycle (0 is start, 1 is end)
  527.             Microseconds(&now);
  528.             gTestHiLevelInterpolant = Utils_Interval(&gTestHiLevelCycleStart, &now) / gTestHiLevelData.duration;
  529.             
  530.             switch (Menu_GetInterpolation())
  531.             {
  532.                 case kInterpolationItem_Sinusoidal:
  533.                     gTestHiLevelInterpolant = 0.5*sinf(gTestHiLevelInterpolant*_PI*2.0) + 0.5;
  534.                 break;
  535.                 
  536.                 case kInterpolationItem_Triangular:
  537.                     gTestHiLevelInterpolant = 2.0*fmodf(gTestHiLevelInterpolant, 1.0);
  538.                     
  539.                     if (gTestHiLevelInterpolant > 1.0)
  540.                     {
  541.                         gTestHiLevelInterpolant = 2.0-gTestHiLevelInterpolant;
  542.                     }
  543.                 break;
  544.                 
  545.                 case kInterpolationItem_Sawtooth:
  546.                     gTestHiLevelInterpolant = fmodf(2.0*gTestHiLevelInterpolant, 1.0);
  547.                 break;
  548.             }
  549.             
  550.             TestHiLevel_Interpolate();
  551.         break;
  552.     }
  553.     
  554.     // Do dialog stuff
  555.     if (passToDialog)
  556.     {
  557.         consumed = IsDialogEvent(inEvent);
  558.         if (consumed)
  559.         {
  560.             if (DialogSelect(inEvent, &window, &item))
  561.             {
  562.                 switch (item)
  563.                 {
  564.                     case kHiLevelItem_Update:
  565.                         TestHiLevel_GetDialogFields();
  566.                     break;
  567.                 }
  568.             }
  569.         }
  570.     }
  571.     
  572.     // Return the result
  573.     *outConsumed = consumed;
  574. }
  575.  
  576.  
  577. /* =============================================================================
  578.  *        TestHiLevel_Update (internal)
  579.  *
  580.  *    Updates the contents of the window.
  581.  * ========================================================================== */
  582. void TestHiLevel_Update(
  583.     WindowPtr            inWindow)
  584. {
  585.     DrawDialog(inWindow);
  586. }
  587.  
  588.  
  589. /* =============================================================================
  590.  *        TestHiLevel_Activate (internal)
  591.  *
  592.  *    Handles window activation.
  593.  * ========================================================================== */
  594. void TestHiLevel_Activate(
  595.     WindowPtr            inWindow)
  596. {
  597.     InsertMenu(gTestHiLevelPresetMenu, 0);
  598.     DrawMenuBar();
  599. }
  600.  
  601.  
  602. /* =============================================================================
  603.  *        TestHiLevel_Deactivate (internal)
  604.  *
  605.  *    Handles window deactivation.
  606.  * ========================================================================== */
  607. void TestHiLevel_Deactivate(
  608.     WindowPtr            inWindow)
  609. {
  610.     DeleteMenu(kMenuID_HiLevelPreset);
  611.     DrawMenuBar();
  612. }
  613.  
  614.  
  615. /* =============================================================================
  616.  *        TestHiLevel_ProgressUserItem (internal)
  617.  *
  618.  *    Draws the user item used for progress bar, based on gTestHiLevelInterpolant.
  619.  * ========================================================================== */
  620. pascal void TestHiLevel_ProgressUserItem(
  621.     DialogPtr            inDialog,
  622.     short                inItem)
  623. {
  624.     short                itemType;
  625.     Handle                itemHandle;
  626.     Rect                itemBounds;
  627.     short                size;
  628.     Rect                leftWhite;
  629.     Rect                rightWhite;
  630.     Rect                indicator;
  631.     
  632.     GetDialogItem(inDialog, inItem, &itemType, &itemHandle, &itemBounds);
  633.     
  634.     FrameRect(&itemBounds);
  635.     
  636.     InsetRect(&itemBounds, 1, 1);
  637.     size = itemBounds.bottom-itemBounds.top;
  638.     
  639.     indicator = itemBounds;
  640.     indicator.left = itemBounds.left + (long) (gTestHiLevelInterpolant*(itemBounds.right-itemBounds.left-size) + 0.5);
  641.     indicator.right = indicator.left+size;
  642.     
  643.     leftWhite = itemBounds;
  644.     leftWhite.right = indicator.left;
  645.     
  646.     rightWhite = itemBounds;
  647.     rightWhite.left = indicator.right;
  648.     
  649.     FrameRect(&indicator);
  650.     
  651.     InsetRect(&indicator, 1, 1);
  652.     FillRect(&indicator, &qd.gray);
  653.     
  654.     EraseRect(&leftWhite);
  655.     EraseRect(&rightWhite);
  656. }
  657.  
  658.  
  659. /* =============================================================================
  660.  *        TestHiLevel_Interpolate (internal)
  661.  *
  662.  *    Changes the sound channel to the correct values for the point between
  663.  *    zero and one determined by gTestHiLevelInterpolant.
  664.  * ========================================================================== */
  665. void TestHiLevel_Interpolate(
  666.     void)
  667. {
  668.     OSStatus            err;
  669.     TQ3Vector3D            v0;
  670.     TQ3Vector3D            v1;
  671.     TQ3Vector3D            v2;
  672.     TQ3Point3D            origin = {0.0, 0.0, 0.0};
  673.     TQ3Matrix4x4        m0;
  674.     TQ3Matrix4x4        m1;
  675.     TQ3Matrix4x4        m2;
  676.     TQ3Matrix4x4        m;
  677.     SSpLocalizationData    snd3DInfo;
  678.     
  679.     if (gTestHiLevelUpdate                            ||
  680.         gTestHiLevelData.listenerTranslateRange        ||
  681.         gTestHiLevelData.listenerRotationAxisRange    ||
  682.         gTestHiLevelData.listenerRotationAngleRange    ||
  683.         gTestHiLevelData.listenerScaleRange)
  684.     {
  685.         TestHiLevel_InterpolateVector3D(
  686.                 gTestHiLevelInterpolant,
  687.                 &gTestHiLevelData.listenerTranslate1,
  688.                 &gTestHiLevelData.listenerTranslate2,
  689.                 gTestHiLevelData.listenerTranslateRange,
  690.                 &v0);
  691.         
  692.         TestHiLevel_InterpolateNormalVector3D(
  693.                 gTestHiLevelInterpolant,
  694.                 &gTestHiLevelData.listenerRotationAxis1,
  695.                 &gTestHiLevelData.listenerRotationAxis2,
  696.                 gTestHiLevelData.listenerRotationAxisRange,
  697.                 &v1);
  698.         
  699.         TestHiLevel_InterpolateVector3D(
  700.                 gTestHiLevelInterpolant,
  701.                 &gTestHiLevelData.listenerScale1,
  702.                 &gTestHiLevelData.listenerScale2,
  703.                 gTestHiLevelData.listenerScaleRange,
  704.                 &v2);
  705.         
  706.         Q3Matrix4x4_SetTranslate(
  707.                 &m0,
  708.                 v0.x,
  709.                 v0.y,
  710.                 v0.z);
  711.         
  712.         Q3Matrix4x4_SetRotateAboutAxis(
  713.                 &m1,
  714.                 &origin,
  715.                 &v1,
  716.                 Q3Math_DegreesToRadians(TestHiLevel_InterpolateFloat(
  717.                         gTestHiLevelInterpolant,
  718.                         gTestHiLevelData.listenerRotationAngle1,
  719.                         gTestHiLevelData.listenerRotationAngle2,
  720.                         gTestHiLevelData.listenerRotationAngleRange)));
  721.         
  722.         Q3Matrix4x4_SetScale(
  723.                 &m2,
  724.                 v2.x,
  725.                 v2.y,
  726.                 v2.z);
  727.         
  728.         Q3Matrix4x4_Multiply(
  729.                 &m0,
  730.                 &m1,
  731.                 &m);
  732.         
  733.         Q3Matrix4x4_Multiply(
  734.                 &m,
  735.                 &m2,
  736.                 &m);
  737.         
  738.         err = SSpListener_SetTransform(gTestHiLevelListener, &m);
  739.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpListener_SetTransform");
  740.     }
  741.     
  742.     if (gTestHiLevelUpdate                            ||
  743.         gTestHiLevelData.listenerPositionRange)
  744.     {
  745.         TestHiLevel_InterpolateVector3D(
  746.                 gTestHiLevelInterpolant,
  747.                 &gTestHiLevelData.listenerPosition1,
  748.                 &gTestHiLevelData.listenerPosition2,
  749.                 gTestHiLevelData.listenerPositionRange,
  750.                 &v0);
  751.         
  752.         err = SSpListener_SetPosition(gTestHiLevelListener, (const TQ3Point3D*) &v0);
  753.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpListener_SetPosition");
  754.     }
  755.     
  756.     if (gTestHiLevelUpdate                            ||
  757.         gTestHiLevelData.listenerOrientationRange)
  758.     {
  759.         TestHiLevel_InterpolateNormalVector3D(
  760.                 gTestHiLevelInterpolant,
  761.                 &gTestHiLevelData.listenerOrientation1,
  762.                 &gTestHiLevelData.listenerOrientation2,
  763.                 gTestHiLevelData.listenerOrientationRange,
  764.                 &v0);
  765.         
  766.         err = SSpListener_SetOrientation(gTestHiLevelListener, &v0);
  767.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpListener_SetOrientation");
  768.     }
  769.     
  770.     if (gTestHiLevelUpdate                            ||
  771.         gTestHiLevelData.listenerUpVectorRange)
  772.     {
  773.         TestHiLevel_InterpolateNormalVector3D(
  774.                 gTestHiLevelInterpolant,
  775.                 &gTestHiLevelData.listenerUpVector1,
  776.                 &gTestHiLevelData.listenerUpVector2,
  777.                 gTestHiLevelData.listenerUpVectorRange,
  778.                 &v0);
  779.         
  780.         err = SSpListener_SetUpVector(gTestHiLevelListener, &v0);
  781.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpListener_SetUpVector");
  782.     }
  783.     
  784.     if (gTestHiLevelUpdate                            ||
  785.         gTestHiLevelData.listenerVelocityRange)
  786.     {
  787.         TestHiLevel_InterpolateVector3D(
  788.                 gTestHiLevelInterpolant,
  789.                 &gTestHiLevelData.listenerVelocity1,
  790.                 &gTestHiLevelData.listenerVelocity2,
  791.                 gTestHiLevelData.listenerVelocityRange,
  792.                 &v0);
  793.         
  794.         err = SSpListener_SetVelocity(gTestHiLevelListener, &v0);
  795.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpListener_SetVelocity");
  796.     }
  797.     
  798.     if (gTestHiLevelUpdate                            ||
  799.         gTestHiLevelData.humidityRange)
  800.     {
  801.         err = SSpListener_SetMedium(
  802.                 gTestHiLevelListener,
  803.                 gTestHiLevelData.medium,
  804.                 TestHiLevel_InterpolateFloat(
  805.                         gTestHiLevelInterpolant,
  806.                         gTestHiLevelData.humidity1,
  807.                         gTestHiLevelData.humidity2,
  808.                         gTestHiLevelData.humidityRange));
  809.         
  810.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpListener_SetMedium");
  811.     }
  812.     
  813.     if (gTestHiLevelUpdate                            ||
  814.         gTestHiLevelData.roomSizeRange                ||
  815.         gTestHiLevelData.roomReflectivityRange        ||
  816.         gTestHiLevelData.reverbAttenuationRange)
  817.     {
  818.         err = SSpListener_SetReverb(
  819.                 gTestHiLevelListener,
  820.                 TestHiLevel_InterpolateFloat(
  821.                         gTestHiLevelInterpolant,
  822.                         gTestHiLevelData.roomSize1,
  823.                         gTestHiLevelData.roomSize2,
  824.                         gTestHiLevelData.roomSizeRange),
  825.                 TestHiLevel_InterpolateFloat(
  826.                         gTestHiLevelInterpolant,
  827.                         gTestHiLevelData.roomReflectivity1,
  828.                         gTestHiLevelData.roomReflectivity2,
  829.                         gTestHiLevelData.roomReflectivityRange),
  830.                 TestHiLevel_InterpolateFloat(
  831.                         gTestHiLevelInterpolant,
  832.                         gTestHiLevelData.reverbAttenuation1,
  833.                         gTestHiLevelData.reverbAttenuation2,
  834.                         gTestHiLevelData.reverbAttenuationRange));
  835.         
  836.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpListener_SetReverb");
  837.     }
  838.     
  839.     if (gTestHiLevelUpdate                            ||
  840.         gTestHiLevelData.cpuLoadRange)
  841.     {
  842.         err = SSpSource_SetCPULoad(
  843.                 gTestHiLevelSource,
  844.                 (UInt32) (TestHiLevel_InterpolateFloat(
  845.                         gTestHiLevelInterpolant,
  846.                         (float) gTestHiLevelData.cpuLoad1,
  847.                         (float) gTestHiLevelData.cpuLoad2,
  848.                         gTestHiLevelData.cpuLoadRange) + 0.5));
  849.         
  850.         Message_CheckError(err, "TestHiLevel_Interpolate", "SetSourceCPULoad");
  851.     }
  852.     
  853.     if (gTestHiLevelUpdate                            ||
  854.         gTestHiLevelData.sourceTranslateRange        ||
  855.         gTestHiLevelData.sourceRotationAxisRange    ||
  856.         gTestHiLevelData.sourceRotationAngleRange    ||
  857.         gTestHiLevelData.sourceScaleRange)
  858.     {
  859.         TestHiLevel_InterpolateVector3D(
  860.                 gTestHiLevelInterpolant,
  861.                 &gTestHiLevelData.sourceTranslate1,
  862.                 &gTestHiLevelData.sourceTranslate2,
  863.                 gTestHiLevelData.sourceTranslateRange,
  864.                 &v0);
  865.         
  866.         TestHiLevel_InterpolateNormalVector3D(
  867.                 gTestHiLevelInterpolant,
  868.                 &gTestHiLevelData.sourceRotationAxis1,
  869.                 &gTestHiLevelData.sourceRotationAxis2,
  870.                 gTestHiLevelData.sourceRotationAxisRange,
  871.                 &v1);
  872.         
  873.         TestHiLevel_InterpolateVector3D(
  874.                 gTestHiLevelInterpolant,
  875.                 &gTestHiLevelData.sourceScale1,
  876.                 &gTestHiLevelData.sourceScale2,
  877.                 gTestHiLevelData.sourceScaleRange,
  878.                 &v2);
  879.         
  880.         Q3Matrix4x4_SetTranslate(
  881.                 &m0,
  882.                 v0.x,
  883.                 v0.y,
  884.                 v0.z);
  885.         
  886.         Q3Matrix4x4_SetRotateAboutAxis(
  887.                 &m1,
  888.                 &origin,
  889.                 &v1,
  890.                 Q3Math_DegreesToRadians(TestHiLevel_InterpolateFloat(
  891.                         gTestHiLevelInterpolant,
  892.                         gTestHiLevelData.sourceRotationAngle1,
  893.                         gTestHiLevelData.sourceRotationAngle2,
  894.                         gTestHiLevelData.sourceRotationAngleRange)));
  895.         
  896.         Q3Matrix4x4_SetScale(
  897.                 &m2,
  898.                 v2.x,
  899.                 v2.y,
  900.                 v2.z);
  901.         
  902.         Q3Matrix4x4_Multiply(
  903.                 &m0,
  904.                 &m1,
  905.                 &m);
  906.         
  907.         Q3Matrix4x4_Multiply(
  908.                 &m,
  909.                 &m2,
  910.                 &m);
  911.         
  912.         err = SSpSource_SetTransform(gTestHiLevelSource, &m);
  913.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpSource_SetTransform");
  914.     }
  915.     
  916.     if (gTestHiLevelUpdate                            ||
  917.         gTestHiLevelData.sourcePositionRange)
  918.     {
  919.         TestHiLevel_InterpolateVector3D(
  920.                 gTestHiLevelInterpolant,
  921.                 &gTestHiLevelData.sourcePosition1,
  922.                 &gTestHiLevelData.sourcePosition2,
  923.                 gTestHiLevelData.sourcePositionRange,
  924.                 &v0);
  925.         
  926.         err = SSpSource_SetPosition(gTestHiLevelSource, (const TQ3Point3D*) &v0);
  927.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpSource_SetPosition");
  928.     }
  929.     
  930.     if (gTestHiLevelUpdate                            ||
  931.         gTestHiLevelData.sourceOrientationRange)
  932.     {
  933.         TestHiLevel_InterpolateNormalVector3D(
  934.                 gTestHiLevelInterpolant,
  935.                 &gTestHiLevelData.sourceOrientation1,
  936.                 &gTestHiLevelData.sourceOrientation2,
  937.                 gTestHiLevelData.sourceOrientationRange,
  938.                 &v0);
  939.         
  940.         err = SSpSource_SetOrientation(gTestHiLevelSource, &v0);
  941.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpSource_SetOrientation");
  942.     }
  943.     
  944.     if (gTestHiLevelUpdate                            ||
  945.         gTestHiLevelData.sourceUpVectorRange)
  946.     {
  947.         TestHiLevel_InterpolateNormalVector3D(
  948.                 gTestHiLevelInterpolant,
  949.                 &gTestHiLevelData.sourceUpVector1,
  950.                 &gTestHiLevelData.sourceUpVector2,
  951.                 gTestHiLevelData.sourceUpVectorRange,
  952.                 &v0);
  953.         
  954.         err = SSpSource_SetUpVector(gTestHiLevelSource, &v0);
  955.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpSource_SetUpVector");
  956.     }
  957.     
  958.     if (gTestHiLevelUpdate                            ||
  959.         gTestHiLevelData.sourceVelocityRange)
  960.     {
  961.         TestHiLevel_InterpolateVector3D(
  962.                 gTestHiLevelInterpolant,
  963.                 &gTestHiLevelData.sourceVelocity1,
  964.                 &gTestHiLevelData.sourceVelocity2,
  965.                 gTestHiLevelData.sourceVelocityRange,
  966.                 &v0);
  967.         
  968.         err = SSpSource_SetVelocity(gTestHiLevelSource, &v0);
  969.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpSource_SetVelocity");
  970.     }
  971.     
  972.     if (gTestHiLevelUpdate)
  973.     {
  974.         err = SSpSource_SetMode(
  975.                 gTestHiLevelSource,
  976.                 gTestHiLevelData.sourceMode);
  977.         
  978.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpSource_SetMode");
  979.     }
  980.     
  981.     if (gTestHiLevelUpdate                            ||
  982.         gTestHiLevelData.referenceDistanceRange)
  983.     {
  984.         err = SSpSource_SetReferenceDistance(
  985.                 gTestHiLevelSource,
  986.                 TestHiLevel_InterpolateFloat(
  987.                         gTestHiLevelInterpolant,
  988.                         gTestHiLevelData.referenceDistance1,
  989.                         gTestHiLevelData.referenceDistance2,
  990.                         gTestHiLevelData.referenceDistanceRange));
  991.         
  992.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpSource_SetReferenceDistance");
  993.     }
  994.     
  995.     if (gTestHiLevelUpdate                            ||
  996.         gTestHiLevelData.lengthRange                ||
  997.         gTestHiLevelData.widthRange                    ||
  998.         gTestHiLevelData.heightRange)
  999.     {
  1000.         err = SSpSource_SetSize(
  1001.                 gTestHiLevelSource,
  1002.                 TestHiLevel_InterpolateFloat(
  1003.                         gTestHiLevelInterpolant,
  1004.                         gTestHiLevelData.length1,
  1005.                         gTestHiLevelData.length2,
  1006.                         gTestHiLevelData.lengthRange),
  1007.                 TestHiLevel_InterpolateFloat(
  1008.                         gTestHiLevelInterpolant,
  1009.                         gTestHiLevelData.width1,
  1010.                         gTestHiLevelData.width2,
  1011.                         gTestHiLevelData.widthRange),
  1012.                 TestHiLevel_InterpolateFloat(
  1013.                         gTestHiLevelInterpolant,
  1014.                         gTestHiLevelData.height1,
  1015.                         gTestHiLevelData.height2,
  1016.                         gTestHiLevelData.heightRange));
  1017.         
  1018.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpSource_SetSize");
  1019.     }
  1020.     
  1021.     if (gTestHiLevelUpdate                            ||
  1022.         gTestHiLevelData.coneAngleDegRange            ||
  1023.         gTestHiLevelData.coneAttenuationRange)
  1024.     {
  1025.         err = SSpSource_SetAngularAttenuation(
  1026.                 gTestHiLevelSource,
  1027.                 Q3Math_DegreesToRadians(TestHiLevel_InterpolateFloat(
  1028.                         gTestHiLevelInterpolant,
  1029.                         gTestHiLevelData.coneAngleDeg1,
  1030.                         gTestHiLevelData.coneAngleDeg2,
  1031.                         gTestHiLevelData.coneAngleDegRange)),
  1032.                 TestHiLevel_InterpolateFloat(
  1033.                         gTestHiLevelInterpolant,
  1034.                         gTestHiLevelData.coneAttenuation1,
  1035.                         gTestHiLevelData.coneAttenuation2,
  1036.                         gTestHiLevelData.coneAttenuationRange));
  1037.         
  1038.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpSource_SetAngularAttenuation");
  1039.     }
  1040.     
  1041.     // Make the filter changes
  1042.     err = SSpSource_CalcLocalization(gTestHiLevelSource, gTestHiLevelListener, &snd3DInfo);
  1043.     Message_CheckError(err, "TestHiLevel_Interpolate", "SSpSource_CalcLocalization");
  1044.     
  1045.     Sound_Set3DInfo(&snd3DInfo);
  1046.     
  1047.     // Update the progress bar
  1048.     SetPort(gTestHiLevelDialog);
  1049.     TestHiLevel_ProgressUserItem(gTestHiLevelDialog, kHiLevelItem_Progress);
  1050.     
  1051.     // Show the actual velocities
  1052.     err = SSpListener_GetActualVelocity(gTestHiLevelListener, &v0);
  1053.     Message_CheckError(err, "TestHiLevel_Interpolate", "SSpListener_GetActualVelocity");
  1054.     
  1055.     if (gTestHiLevelListenerActual.x != v0.x ||
  1056.         gTestHiLevelListenerActual.y != v0.y ||
  1057.         gTestHiLevelListenerActual.z != v0.z)
  1058.     {
  1059.         gTestHiLevelListenerActual = v0;
  1060.         
  1061.         Utils_SetVector3DField(
  1062.                 gTestHiLevelDialog,
  1063.                 kHiLevelItem_ListenerActualVelocity,
  1064.                 &gTestHiLevelListenerActual,
  1065.                 true);
  1066.     }
  1067.     
  1068.     err = SSpSource_GetActualVelocity(gTestHiLevelSource, &v0);
  1069.     Message_CheckError(err, "TestHiLevel_Interpolate", "SSpSource_GetActualVelocity");
  1070.     
  1071.     if (gTestHiLevelSourceActual.x != v0.x ||
  1072.         gTestHiLevelSourceActual.y != v0.y ||
  1073.         gTestHiLevelSourceActual.z != v0.z)
  1074.     {
  1075.         gTestHiLevelSourceActual = v0;
  1076.         
  1077.         Utils_SetVector3DField(
  1078.                 gTestHiLevelDialog,
  1079.                 kHiLevelItem_SourceActualVelocity,
  1080.                 &gTestHiLevelSourceActual,
  1081.                 true);
  1082.     }
  1083.     
  1084.     // Done
  1085.     gTestHiLevelUpdate = false;
  1086. }
  1087.  
  1088.  
  1089. /* =============================================================================
  1090.  *        TestHiLevel_InterpolateFloat (internal)
  1091.  *
  1092.  *    Linear interpolation.  When inWhere is zero, inVal0 is returned.  When it
  1093.  *    is one, inVal1 is returned.  In between is linear.  If inIsRange is false
  1094.  *    then we ignore inVal1 and always return inVal0.
  1095.  * ========================================================================== */
  1096. float TestHiLevel_InterpolateFloat(
  1097.     float                inWhere,
  1098.     float                inVal0,
  1099.     float                inVal1,
  1100.     Boolean                inIsRange)
  1101. {
  1102.     float                result;
  1103.     
  1104.     if (inIsRange)
  1105.     {
  1106.         result = inWhere*(inVal1-inVal0) + inVal0;
  1107.     }
  1108.     else
  1109.     {
  1110.         result = inVal0;
  1111.     }
  1112.     
  1113.     return result;
  1114. }
  1115.  
  1116.  
  1117. /* =============================================================================
  1118.  *        TestHiLevel_InterpolateVector3D (internal)
  1119.  *
  1120.  *    Linear interpolation on vectors.
  1121.  * ========================================================================== */
  1122. static void TestHiLevel_InterpolateVector3D(
  1123.     float                inWhere,
  1124.     const TQ3Vector3D*    inVal0,
  1125.     const TQ3Vector3D*    inVal1,
  1126.     Boolean                inIsRange,
  1127.     TQ3Vector3D*        outResult)
  1128. {
  1129.     if (inIsRange)
  1130.     {
  1131.         outResult->x = TestHiLevel_InterpolateFloat(inWhere, inVal0->x, inVal1->x, true);
  1132.         outResult->y = TestHiLevel_InterpolateFloat(inWhere, inVal0->y, inVal1->y, true);
  1133.         outResult->z = TestHiLevel_InterpolateFloat(inWhere, inVal0->z, inVal1->z, true);
  1134.     }
  1135.     else
  1136.     {
  1137.         *outResult = *inVal0;
  1138.     }
  1139. }
  1140.  
  1141.  
  1142. /* =============================================================================
  1143.  *        TestHiLevel_InterpolateNormalVector3D (internal)
  1144.  *
  1145.  *    Interpolation on unit-length vectors.
  1146.  *
  1147.  *    NOTE:    We could do a better job of this, e. g. spherical interpolation,
  1148.  *            but why bother?
  1149.  * ========================================================================== */
  1150. static void TestHiLevel_InterpolateNormalVector3D(
  1151.     float                inWhere,
  1152.     const TQ3Vector3D*    inVal0,
  1153.     const TQ3Vector3D*    inVal1,
  1154.     Boolean                inIsRange,
  1155.     TQ3Vector3D*        outResult)
  1156. {
  1157.     float                scale;
  1158.     
  1159.     TestHiLevel_InterpolateVector3D(inWhere, inVal0, inVal1, inIsRange, outResult);
  1160.     
  1161.     scale = outResult->x*outResult->x +
  1162.             outResult->y*outResult->y +
  1163.             outResult->z*outResult->z;
  1164.     
  1165.     if (scale > 0.001)
  1166.     {
  1167.         scale = 1.0/sqrtf(scale);
  1168.         
  1169.         outResult->x *= scale;
  1170.         outResult->y *= scale;
  1171.         outResult->z *= scale;
  1172.     }
  1173. }
  1174.  
  1175.  
  1176. /* =============================================================================
  1177.  *        TestHiLevel_DeriveData (internal)
  1178.  *
  1179.  *    Compute the derived fields in gTestHiLevelData.
  1180.  * ========================================================================== */
  1181. void TestHiLevel_DeriveData(
  1182.     void)
  1183. {
  1184.     gTestHiLevelData.coneAngleCos1 = cosf(0.5*(_PI/180.0)*gTestHiLevelData.coneAngleDeg1);
  1185.     gTestHiLevelData.coneAngleCos2 = cosf(0.5*(_PI/180.0)*gTestHiLevelData.coneAngleDeg2);
  1186.     
  1187.     //• FOR THE NON-RANGE VALUES, SET THEM IN THE SOURCE AND LISTENER
  1188. }
  1189.  
  1190.  
  1191. /* =============================================================================
  1192.  *        TestHiLevel_SetDialogFields (internal)
  1193.  *
  1194.  *    Changes the dialog's fields to reflect gTestHiLevelData.
  1195.  * ========================================================================== */
  1196. void TestHiLevel_SetDialogFields(
  1197.     void)
  1198. {
  1199.     short                itemType;
  1200.     Handle                itemHandle;
  1201.     Rect                itemBounds;
  1202.     short                value;
  1203.     
  1204.     Utils_SetFloatField(
  1205.             gTestHiLevelDialog,
  1206.             kHiLevelItem_Duration,
  1207.             gTestHiLevelData.duration,
  1208.             true);
  1209.     
  1210.     Utils_SetVector3DField(
  1211.             gTestHiLevelDialog,
  1212.             kHiLevelItem_ListenerTranslate1,
  1213.             &gTestHiLevelData.listenerTranslate1,
  1214.             true);
  1215.     
  1216.     Utils_SetVector3DField(
  1217.             gTestHiLevelDialog,
  1218.             kHiLevelItem_ListenerTranslate2,
  1219.             &gTestHiLevelData.listenerTranslate2,
  1220.             gTestHiLevelData.listenerTranslateRange);
  1221.     
  1222.     Utils_SetVector3DField(
  1223.             gTestHiLevelDialog,
  1224.             kHiLevelItem_ListenerRotationAxis1,
  1225.             &gTestHiLevelData.listenerRotationAxis1,
  1226.             true);
  1227.     
  1228.     Utils_SetVector3DField(
  1229.             gTestHiLevelDialog,
  1230.             kHiLevelItem_ListenerRotationAxis2,
  1231.             &gTestHiLevelData.listenerRotationAxis2,
  1232.             gTestHiLevelData.listenerRotationAxisRange);
  1233.     
  1234.     Utils_SetFloatField(
  1235.             gTestHiLevelDialog,
  1236.             kHiLevelItem_ListenerRotationAngle1,
  1237.             gTestHiLevelData.listenerRotationAngle1,
  1238.             true);
  1239.     
  1240.     Utils_SetFloatField(
  1241.             gTestHiLevelDialog,
  1242.             kHiLevelItem_ListenerRotationAngle2,
  1243.             gTestHiLevelData.listenerRotationAngle2,
  1244.             gTestHiLevelData.listenerRotationAngleRange);
  1245.     
  1246.     Utils_SetVector3DField(
  1247.             gTestHiLevelDialog,
  1248.             kHiLevelItem_ListenerScale1,
  1249.             &gTestHiLevelData.listenerScale1,
  1250.             true);
  1251.     
  1252.     Utils_SetVector3DField(
  1253.             gTestHiLevelDialog,
  1254.             kHiLevelItem_ListenerScale2,
  1255.             &gTestHiLevelData.listenerScale2,
  1256.             gTestHiLevelData.listenerScaleRange);
  1257.     
  1258.     Utils_SetVector3DField(
  1259.             gTestHiLevelDialog,
  1260.             kHiLevelItem_ListenerPosition1,
  1261.             &gTestHiLevelData.listenerPosition1,
  1262.             true);
  1263.     
  1264.     Utils_SetVector3DField(
  1265.             gTestHiLevelDialog,
  1266.             kHiLevelItem_ListenerPosition2,
  1267.             &gTestHiLevelData.listenerPosition2,
  1268.             gTestHiLevelData.listenerPositionRange);
  1269.     
  1270.     Utils_SetVector3DField(
  1271.             gTestHiLevelDialog,
  1272.             kHiLevelItem_ListenerOrientation1,
  1273.             &gTestHiLevelData.listenerOrientation1,
  1274.             true);
  1275.     
  1276.     Utils_SetVector3DField(
  1277.             gTestHiLevelDialog,
  1278.             kHiLevelItem_ListenerOrientation2,
  1279.             &gTestHiLevelData.listenerOrientation2,
  1280.             gTestHiLevelData.listenerOrientationRange);
  1281.     
  1282.     Utils_SetVector3DField(
  1283.             gTestHiLevelDialog,
  1284.             kHiLevelItem_ListenerUpVector1,
  1285.             &gTestHiLevelData.listenerUpVector1,
  1286.             true);
  1287.     
  1288.     Utils_SetVector3DField(
  1289.             gTestHiLevelDialog,
  1290.             kHiLevelItem_ListenerUpVector2,
  1291.             &gTestHiLevelData.listenerUpVector2,
  1292.             gTestHiLevelData.listenerUpVectorRange);
  1293.     
  1294.     Utils_SetVector3DField(
  1295.             gTestHiLevelDialog,
  1296.             kHiLevelItem_ListenerVelocity1,
  1297.             &gTestHiLevelData.listenerVelocity1,
  1298.             true);
  1299.     
  1300.     Utils_SetVector3DField(
  1301.             gTestHiLevelDialog,
  1302.             kHiLevelItem_ListenerVelocity2,
  1303.             &gTestHiLevelData.listenerVelocity2,
  1304.             gTestHiLevelData.listenerVelocityRange);
  1305.     
  1306.     GetDialogItem(gTestHiLevelDialog, kHiLevelItem_Medium, &itemType, &itemHandle, &itemBounds);
  1307.     SetControlValue((ControlHandle) itemHandle,
  1308.             (gTestHiLevelData.medium == kSSpMedium_Water)
  1309.                     ? kMediumItem_Water
  1310.                     : kMediumItem_Air);
  1311.     
  1312.     Utils_SetFloatField(
  1313.             gTestHiLevelDialog,
  1314.             kHiLevelItem_Humidity1,
  1315.             gTestHiLevelData.humidity1,
  1316.             true);
  1317.     
  1318.     Utils_SetFloatField(
  1319.             gTestHiLevelDialog,
  1320.             kHiLevelItem_Humidity2,
  1321.             gTestHiLevelData.humidity2,
  1322.             gTestHiLevelData.humidityRange);
  1323.     
  1324.     Utils_SetFloatField(
  1325.             gTestHiLevelDialog,
  1326.             kHiLevelItem_RoomSize1,
  1327.             gTestHiLevelData.roomSize1,
  1328.             true);
  1329.     
  1330.     Utils_SetFloatField(
  1331.             gTestHiLevelDialog,
  1332.             kHiLevelItem_RoomSize2,
  1333.             gTestHiLevelData.roomSize2,
  1334.             gTestHiLevelData.roomSizeRange);
  1335.     
  1336.     Utils_SetFloatField(
  1337.             gTestHiLevelDialog,
  1338.             kHiLevelItem_RoomReflectivity1,
  1339.             gTestHiLevelData.roomReflectivity1,
  1340.             true);
  1341.     
  1342.     Utils_SetFloatField(
  1343.             gTestHiLevelDialog,
  1344.             kHiLevelItem_RoomReflectivity2,
  1345.             gTestHiLevelData.roomReflectivity2,
  1346.             gTestHiLevelData.roomReflectivityRange);
  1347.     
  1348.     Utils_SetFloatField(
  1349.             gTestHiLevelDialog,
  1350.             kHiLevelItem_ReverbAttenuation1,
  1351.             gTestHiLevelData.reverbAttenuation1,
  1352.             true);
  1353.     
  1354.     Utils_SetFloatField(
  1355.             gTestHiLevelDialog,
  1356.             kHiLevelItem_ReverbAttenuation2,
  1357.             gTestHiLevelData.reverbAttenuation2,
  1358.             gTestHiLevelData.reverbAttenuationRange);
  1359.     
  1360.     Utils_SetUInt32Field(
  1361.             gTestHiLevelDialog,
  1362.             kHiLevelItem_CPULoad1,
  1363.             gTestHiLevelData.cpuLoad1,
  1364.             true);
  1365.     
  1366.     Utils_SetUInt32Field(
  1367.             gTestHiLevelDialog,
  1368.             kHiLevelItem_CPULoad2,
  1369.             gTestHiLevelData.cpuLoad2,
  1370.             gTestHiLevelData.cpuLoadRange);
  1371.     
  1372.     Utils_SetVector3DField(
  1373.             gTestHiLevelDialog,
  1374.             kHiLevelItem_SourceTranslate1,
  1375.             &gTestHiLevelData.sourceTranslate1,
  1376.             true);
  1377.     
  1378.     Utils_SetVector3DField(
  1379.             gTestHiLevelDialog,
  1380.             kHiLevelItem_SourceTranslate2,
  1381.             &gTestHiLevelData.sourceTranslate2,
  1382.             gTestHiLevelData.sourceTranslateRange);
  1383.     
  1384.     Utils_SetVector3DField(
  1385.             gTestHiLevelDialog,
  1386.             kHiLevelItem_SourceRotationAxis1,
  1387.             &gTestHiLevelData.sourceRotationAxis1,
  1388.             true);
  1389.     
  1390.     Utils_SetVector3DField(
  1391.             gTestHiLevelDialog,
  1392.             kHiLevelItem_SourceRotationAxis2,
  1393.             &gTestHiLevelData.sourceRotationAxis2,
  1394.             gTestHiLevelData.sourceRotationAxisRange);
  1395.     
  1396.     Utils_SetFloatField(
  1397.             gTestHiLevelDialog,
  1398.             kHiLevelItem_SourceRotationAngle1,
  1399.             gTestHiLevelData.sourceRotationAngle1,
  1400.             true);
  1401.     
  1402.     Utils_SetFloatField(
  1403.             gTestHiLevelDialog,
  1404.             kHiLevelItem_SourceRotationAngle2,
  1405.             gTestHiLevelData.sourceRotationAngle2,
  1406.             gTestHiLevelData.sourceRotationAngleRange);
  1407.     
  1408.     Utils_SetVector3DField(
  1409.             gTestHiLevelDialog,
  1410.             kHiLevelItem_SourceScale1,
  1411.             &gTestHiLevelData.sourceScale1,
  1412.             true);
  1413.     
  1414.     Utils_SetVector3DField(
  1415.             gTestHiLevelDialog,
  1416.             kHiLevelItem_SourceScale2,
  1417.             &gTestHiLevelData.sourceScale2,
  1418.             gTestHiLevelData.sourceScaleRange);
  1419.     
  1420.     Utils_SetVector3DField(
  1421.             gTestHiLevelDialog,
  1422.             kHiLevelItem_SourcePosition1,
  1423.             &gTestHiLevelData.sourcePosition1,
  1424.             true);
  1425.     
  1426.     Utils_SetVector3DField(
  1427.             gTestHiLevelDialog,
  1428.             kHiLevelItem_SourcePosition2,
  1429.             &gTestHiLevelData.sourcePosition2,
  1430.             gTestHiLevelData.sourcePositionRange);
  1431.     
  1432.     Utils_SetVector3DField(
  1433.             gTestHiLevelDialog,
  1434.             kHiLevelItem_SourceOrientation1,
  1435.             &gTestHiLevelData.sourceOrientation1,
  1436.             true);
  1437.     
  1438.     Utils_SetVector3DField(
  1439.             gTestHiLevelDialog,
  1440.             kHiLevelItem_SourceOrientation2,
  1441.             &gTestHiLevelData.sourceOrientation2,
  1442.             gTestHiLevelData.sourceOrientationRange);
  1443.     
  1444.     Utils_SetVector3DField(
  1445.             gTestHiLevelDialog,
  1446.             kHiLevelItem_SourceUpVector1,
  1447.             &gTestHiLevelData.sourceUpVector1,
  1448.             true);
  1449.     
  1450.     Utils_SetVector3DField(
  1451.             gTestHiLevelDialog,
  1452.             kHiLevelItem_SourceUpVector2,
  1453.             &gTestHiLevelData.sourceUpVector2,
  1454.             gTestHiLevelData.sourceUpVectorRange);
  1455.     
  1456.     Utils_SetVector3DField(
  1457.             gTestHiLevelDialog,
  1458.             kHiLevelItem_SourceVelocity1,
  1459.             &gTestHiLevelData.sourceVelocity1,
  1460.             true);
  1461.     
  1462.     Utils_SetVector3DField(
  1463.             gTestHiLevelDialog,
  1464.             kHiLevelItem_SourceVelocity2,
  1465.             &gTestHiLevelData.sourceVelocity2,
  1466.             gTestHiLevelData.sourceVelocityRange);
  1467.     
  1468.     value = kSourceModeItem_Unfiltered;
  1469.     switch (gTestHiLevelData.sourceMode)
  1470.     {
  1471.         case kSSpSourceMode_Localized:
  1472.             value = kSourceModeItem_Localized;
  1473.         break;
  1474.         
  1475.         case kSSpSourceMode_Ambient:
  1476.             value = kSourceModeItem_Ambient;
  1477.         break;
  1478.         
  1479.         case kSSpSourceMode_Binaural:
  1480.             value = kSourceModeItem_Binaural;
  1481.         break;
  1482.     }
  1483.     
  1484.     GetDialogItem(gTestHiLevelDialog, kHiLevelItem_SourceMode, &itemType, &itemHandle, &itemBounds);
  1485.     SetControlValue((ControlHandle) itemHandle, value);
  1486.     
  1487.     Utils_SetFloatField(
  1488.             gTestHiLevelDialog,
  1489.             kHiLevelItem_ReferenceDistance1,
  1490.             gTestHiLevelData.referenceDistance1,
  1491.             true);
  1492.     
  1493.     Utils_SetFloatField(
  1494.             gTestHiLevelDialog,
  1495.             kHiLevelItem_ReferenceDistance2,
  1496.             gTestHiLevelData.referenceDistance2,
  1497.             gTestHiLevelData.referenceDistanceRange);
  1498.     
  1499.     Utils_SetFloatField(
  1500.             gTestHiLevelDialog,
  1501.             kHiLevelItem_Length1,
  1502.             gTestHiLevelData.length1,
  1503.             true);
  1504.     
  1505.     Utils_SetFloatField(
  1506.             gTestHiLevelDialog,
  1507.             kHiLevelItem_Length2,
  1508.             gTestHiLevelData.length2,
  1509.             gTestHiLevelData.lengthRange);
  1510.     
  1511.     Utils_SetFloatField(
  1512.             gTestHiLevelDialog,
  1513.             kHiLevelItem_Width1,
  1514.             gTestHiLevelData.width1,
  1515.             true);
  1516.     
  1517.     Utils_SetFloatField(
  1518.             gTestHiLevelDialog,
  1519.             kHiLevelItem_Width2,
  1520.             gTestHiLevelData.width2,
  1521.             gTestHiLevelData.widthRange);
  1522.     
  1523.     Utils_SetFloatField(
  1524.             gTestHiLevelDialog,
  1525.             kHiLevelItem_Height1,
  1526.             gTestHiLevelData.height1,
  1527.             true);
  1528.     
  1529.     Utils_SetFloatField(
  1530.             gTestHiLevelDialog,
  1531.             kHiLevelItem_Height2,
  1532.             gTestHiLevelData.height2,
  1533.             gTestHiLevelData.heightRange);
  1534.     
  1535.     Utils_SetFloatField(
  1536.             gTestHiLevelDialog,
  1537.             kHiLevelItem_ConeAngleDeg1,
  1538.             gTestHiLevelData.coneAngleDeg1,
  1539.             true);
  1540.     
  1541.     Utils_SetFloatField(
  1542.             gTestHiLevelDialog,
  1543.             kHiLevelItem_ConeAngleDeg2,
  1544.             gTestHiLevelData.coneAngleDeg2,
  1545.             gTestHiLevelData.coneAngleDegRange);
  1546.     
  1547.     Utils_SetFloatField(
  1548.             gTestHiLevelDialog,
  1549.             kHiLevelItem_ConeAttenuation1,
  1550.             gTestHiLevelData.coneAttenuation1,
  1551.             true);
  1552.     
  1553.     Utils_SetFloatField(
  1554.             gTestHiLevelDialog,
  1555.             kHiLevelItem_ConeAttenuation2,
  1556.             gTestHiLevelData.coneAttenuation2,
  1557.             gTestHiLevelData.coneAttenuationRange);
  1558. }
  1559.  
  1560.  
  1561. /* =============================================================================
  1562.  *        TestHiLevel_GetDialogFields (internal)
  1563.  *
  1564.  *    Grabs the contents of the dialog fields and puts them into gTestHiLevelData.
  1565.  * ========================================================================== */
  1566. void TestHiLevel_GetDialogFields(
  1567.     void)
  1568. {
  1569.     const float            small = 0.000001;
  1570.     const float            big = 10000000.0;
  1571.     short                itemType;
  1572.     Handle                itemHandle;
  1573.     Rect                itemBounds;
  1574.     TTestHiLevelData    data;
  1575.     short                badItem;
  1576.     
  1577.     if (!Utils_GetFloatField(
  1578.             gTestHiLevelDialog,
  1579.             kHiLevelItem_Duration,
  1580.             &data.duration,
  1581.             NULL,
  1582.             small,
  1583.             big))
  1584.     {
  1585.         badItem = kHiLevelItem_Duration;
  1586.         goto bail;
  1587.     }
  1588.     
  1589.     if (!Utils_GetVector3DField(
  1590.             gTestHiLevelDialog,
  1591.             kHiLevelItem_ListenerTranslate1,
  1592.             &data.listenerTranslate1,
  1593.             NULL))
  1594.     {
  1595.         badItem = kHiLevelItem_ListenerTranslate1;
  1596.         goto bail;
  1597.     }
  1598.     
  1599.     if (!Utils_GetVector3DField(
  1600.             gTestHiLevelDialog,
  1601.             kHiLevelItem_ListenerTranslate2,
  1602.             &data.listenerTranslate2,
  1603.             &data.listenerTranslateRange))
  1604.     {
  1605.         badItem = kHiLevelItem_ListenerTranslate2;
  1606.         goto bail;
  1607.     }
  1608.     
  1609.     if (!Utils_GetVector3DField(
  1610.             gTestHiLevelDialog,
  1611.             kHiLevelItem_ListenerRotationAxis1,
  1612.             &data.listenerRotationAxis1,
  1613.             NULL))
  1614.     {
  1615.         badItem = kHiLevelItem_ListenerRotationAxis1;
  1616.         goto bail;
  1617.     }
  1618.     
  1619.     if (!Utils_GetVector3DField(
  1620.             gTestHiLevelDialog,
  1621.             kHiLevelItem_ListenerRotationAxis2,
  1622.             &data.listenerRotationAxis2,
  1623.             &data.listenerRotationAxisRange))
  1624.     {
  1625.         badItem = kHiLevelItem_ListenerRotationAxis2;
  1626.         goto bail;
  1627.     }
  1628.     
  1629.     if (!Utils_GetFloatField(
  1630.             gTestHiLevelDialog,
  1631.             kHiLevelItem_ListenerRotationAngle1,
  1632.             &data.listenerRotationAngle1,
  1633.             NULL,
  1634.             -big,
  1635.             big))
  1636.     {
  1637.         badItem = kHiLevelItem_ListenerRotationAngle1;
  1638.         goto bail;
  1639.     }
  1640.     
  1641.     if (!Utils_GetFloatField(
  1642.             gTestHiLevelDialog,
  1643.             kHiLevelItem_ListenerRotationAngle2,
  1644.             &data.listenerRotationAngle2,
  1645.             &data.listenerRotationAngleRange,
  1646.             -big,
  1647.             big))
  1648.     {
  1649.         badItem = kHiLevelItem_ListenerRotationAngle2;
  1650.         goto bail;
  1651.     }
  1652.     
  1653.     if (!Utils_GetVector3DField(
  1654.             gTestHiLevelDialog,
  1655.             kHiLevelItem_ListenerScale1,
  1656.             &data.listenerScale1,
  1657.             NULL))
  1658.     {
  1659.         badItem = kHiLevelItem_ListenerScale1;
  1660.         goto bail;
  1661.     }
  1662.     
  1663.     if (!Utils_GetVector3DField(
  1664.             gTestHiLevelDialog,
  1665.             kHiLevelItem_ListenerScale2,
  1666.             &data.listenerScale2,
  1667.             &data.listenerScaleRange))
  1668.     {
  1669.         badItem = kHiLevelItem_ListenerScale2;
  1670.         goto bail;
  1671.     }
  1672.     
  1673.     if (!Utils_GetVector3DField(
  1674.             gTestHiLevelDialog,
  1675.             kHiLevelItem_ListenerPosition1,
  1676.             &data.listenerPosition1,
  1677.             NULL))
  1678.     {
  1679.         badItem = kHiLevelItem_ListenerPosition1;
  1680.         goto bail;
  1681.     }
  1682.     
  1683.     if (!Utils_GetVector3DField(
  1684.             gTestHiLevelDialog,
  1685.             kHiLevelItem_ListenerPosition2,
  1686.             &data.listenerPosition2,
  1687.             &data.listenerPositionRange))
  1688.     {
  1689.         badItem = kHiLevelItem_ListenerPosition2;
  1690.         goto bail;
  1691.     }
  1692.     
  1693.     if (!Utils_GetVector3DField(
  1694.             gTestHiLevelDialog,
  1695.             kHiLevelItem_ListenerOrientation1,
  1696.             &data.listenerOrientation1,
  1697.             NULL))
  1698.     {
  1699.         badItem = kHiLevelItem_ListenerOrientation1;
  1700.         goto bail;
  1701.     }
  1702.     
  1703.     if (!Utils_GetVector3DField(
  1704.             gTestHiLevelDialog,
  1705.             kHiLevelItem_ListenerOrientation2,
  1706.             &data.listenerOrientation2,
  1707.             &data.listenerOrientationRange))
  1708.     {
  1709.         badItem = kHiLevelItem_ListenerOrientation2;
  1710.         goto bail;
  1711.     }
  1712.     
  1713.     if (!Utils_GetVector3DField(
  1714.             gTestHiLevelDialog,
  1715.             kHiLevelItem_ListenerUpVector1,
  1716.             &data.listenerUpVector1,
  1717.             NULL))
  1718.     {
  1719.         badItem = kHiLevelItem_ListenerUpVector1;
  1720.         goto bail;
  1721.     }
  1722.     
  1723.     if (!Utils_GetVector3DField(
  1724.             gTestHiLevelDialog,
  1725.             kHiLevelItem_ListenerUpVector2,
  1726.             &data.listenerUpVector2,
  1727.             &data.listenerUpVectorRange))
  1728.     {
  1729.         badItem = kHiLevelItem_ListenerUpVector2;
  1730.         goto bail;
  1731.     }
  1732.     
  1733.     if (!Utils_GetVector3DField(
  1734.             gTestHiLevelDialog,
  1735.             kHiLevelItem_ListenerVelocity1,
  1736.             &data.listenerVelocity1,
  1737.             NULL))
  1738.     {
  1739.         badItem = kHiLevelItem_ListenerVelocity1;
  1740.         goto bail;
  1741.     }
  1742.     
  1743.     if (!Utils_GetVector3DField(
  1744.             gTestHiLevelDialog,
  1745.             kHiLevelItem_ListenerVelocity2,
  1746.             &data.listenerVelocity2,
  1747.             &data.listenerVelocityRange))
  1748.     {
  1749.         badItem = kHiLevelItem_ListenerVelocity2;
  1750.         goto bail;
  1751.     }
  1752.     
  1753.     GetDialogItem(gTestHiLevelDialog, kHiLevelItem_Medium, &itemType, &itemHandle, &itemBounds);
  1754.     switch (GetControlValue((ControlHandle) itemHandle))
  1755.     {
  1756.         case kMediumItem_Air:
  1757.             data.medium = kSSpMedium_Air;
  1758.         break;
  1759.         
  1760.         case kMediumItem_Water:
  1761.             data.medium = kSSpMedium_Water;
  1762.         break;
  1763.         
  1764.         default:
  1765.             assert(0);
  1766.     }
  1767.     
  1768.     if (!Utils_GetFloatField(
  1769.             gTestHiLevelDialog,
  1770.             kHiLevelItem_Humidity1,
  1771.             &data.humidity1,
  1772.             NULL,
  1773.             0.0,
  1774.             100.0))
  1775.     {
  1776.         badItem = kHiLevelItem_Humidity1;
  1777.         goto bail;
  1778.     }
  1779.     
  1780.     if (!Utils_GetFloatField(
  1781.             gTestHiLevelDialog,
  1782.             kHiLevelItem_Humidity2,
  1783.             &data.humidity2,
  1784.             &data.humidityRange,
  1785.             0.0,
  1786.             100.0))
  1787.     {
  1788.         badItem = kHiLevelItem_Humidity2;
  1789.         goto bail;
  1790.     }
  1791.     
  1792.     if (!Utils_GetFloatField(
  1793.             gTestHiLevelDialog,
  1794.             kHiLevelItem_RoomSize1,
  1795.             &data.roomSize1,
  1796.             NULL,
  1797.             0.0,
  1798.             big))
  1799.     {
  1800.         badItem = kHiLevelItem_RoomSize1;
  1801.         goto bail;
  1802.     }
  1803.     
  1804.     if (!Utils_GetFloatField(
  1805.             gTestHiLevelDialog,
  1806.             kHiLevelItem_RoomSize2,
  1807.             &data.roomSize2,
  1808.             &data.roomSizeRange,
  1809.             0.0,
  1810.             big))
  1811.     {
  1812.         badItem = kHiLevelItem_RoomSize2;
  1813.         goto bail;
  1814.     }
  1815.     
  1816.     if (!Utils_GetFloatField(
  1817.             gTestHiLevelDialog,
  1818.             kHiLevelItem_RoomReflectivity1,
  1819.             &data.roomReflectivity1,
  1820.             NULL,
  1821.             -big,
  1822.             -small))
  1823.     {
  1824.         badItem = kHiLevelItem_RoomReflectivity1;
  1825.         goto bail;
  1826.     }
  1827.     
  1828.     if (!Utils_GetFloatField(
  1829.             gTestHiLevelDialog,
  1830.             kHiLevelItem_RoomReflectivity2,
  1831.             &data.roomReflectivity2,
  1832.             &data.roomReflectivityRange,
  1833.             -big,
  1834.             -small))
  1835.     {
  1836.         badItem = kHiLevelItem_RoomReflectivity2;
  1837.         goto bail;
  1838.     }
  1839.     
  1840.     if (!Utils_GetFloatField(
  1841.             gTestHiLevelDialog,
  1842.             kHiLevelItem_ReverbAttenuation1,
  1843.             &data.reverbAttenuation1,
  1844.             NULL,
  1845.             -big,
  1846.             big))
  1847.     {
  1848.         badItem = kHiLevelItem_ReverbAttenuation1;
  1849.         goto bail;
  1850.     }
  1851.     
  1852.     if (!Utils_GetFloatField(
  1853.             gTestHiLevelDialog,
  1854.             kHiLevelItem_ReverbAttenuation2,
  1855.             &data.reverbAttenuation2,
  1856.             &data.reverbAttenuationRange,
  1857.             -big,
  1858.             big))
  1859.     {
  1860.         badItem = kHiLevelItem_ReverbAttenuation2;
  1861.         goto bail;
  1862.     }
  1863.     
  1864.     if (!Utils_GetUInt32Field(
  1865.             gTestHiLevelDialog,
  1866.             kHiLevelItem_CPULoad1,
  1867.             &data.cpuLoad1,
  1868.             NULL,
  1869.             0,
  1870.             gTestHiLevelCPULoadLimit))
  1871.     {
  1872.         badItem = kHiLevelItem_CPULoad1;
  1873.         goto bail;
  1874.     }
  1875.     
  1876.     if (!Utils_GetUInt32Field(
  1877.             gTestHiLevelDialog,
  1878.             kHiLevelItem_CPULoad2,
  1879.             &data.cpuLoad2,
  1880.             &data.cpuLoadRange,
  1881.             0,
  1882.             gTestHiLevelCPULoadLimit))
  1883.     {
  1884.         badItem = kHiLevelItem_CPULoad2;
  1885.         goto bail;
  1886.     }
  1887.     
  1888.     if (!Utils_GetVector3DField(
  1889.             gTestHiLevelDialog,
  1890.             kHiLevelItem_SourceTranslate1,
  1891.             &data.sourceTranslate1,
  1892.             NULL))
  1893.     {
  1894.         badItem = kHiLevelItem_SourceTranslate1;
  1895.         goto bail;
  1896.     }
  1897.     
  1898.     if (!Utils_GetVector3DField(
  1899.             gTestHiLevelDialog,
  1900.             kHiLevelItem_SourceTranslate2,
  1901.             &data.sourceTranslate2,
  1902.             &data.sourceTranslateRange))
  1903.     {
  1904.         badItem = kHiLevelItem_SourceTranslate2;
  1905.         goto bail;
  1906.     }
  1907.     
  1908.     if (!Utils_GetVector3DField(
  1909.             gTestHiLevelDialog,
  1910.             kHiLevelItem_SourceRotationAxis1,
  1911.             &data.sourceRotationAxis1,
  1912.             NULL))
  1913.     {
  1914.         badItem = kHiLevelItem_SourceRotationAxis1;
  1915.         goto bail;
  1916.     }
  1917.     
  1918.     if (!Utils_GetVector3DField(
  1919.             gTestHiLevelDialog,
  1920.             kHiLevelItem_SourceRotationAxis2,
  1921.             &data.sourceRotationAxis2,
  1922.             &data.sourceRotationAxisRange))
  1923.     {
  1924.         badItem = kHiLevelItem_SourceRotationAxis2;
  1925.         goto bail;
  1926.     }
  1927.     
  1928.     if (!Utils_GetFloatField(
  1929.             gTestHiLevelDialog,
  1930.             kHiLevelItem_SourceRotationAngle1,
  1931.             &data.sourceRotationAngle1,
  1932.             NULL,
  1933.             -big,
  1934.             big))
  1935.     {
  1936.         badItem = kHiLevelItem_SourceRotationAngle1;
  1937.         goto bail;
  1938.     }
  1939.     
  1940.     if (!Utils_GetFloatField(
  1941.             gTestHiLevelDialog,
  1942.             kHiLevelItem_SourceRotationAngle2,
  1943.             &data.sourceRotationAngle2,
  1944.             &data.sourceRotationAngleRange,
  1945.             -big,
  1946.             big))
  1947.     {
  1948.         badItem = kHiLevelItem_SourceRotationAngle2;
  1949.         goto bail;
  1950.     }
  1951.     
  1952.     if (!Utils_GetVector3DField(
  1953.             gTestHiLevelDialog,
  1954.             kHiLevelItem_SourceScale1,
  1955.             &data.sourceScale1,
  1956.             NULL))
  1957.     {
  1958.         badItem = kHiLevelItem_SourceScale1;
  1959.         goto bail;
  1960.     }
  1961.     
  1962.     if (!Utils_GetVector3DField(
  1963.             gTestHiLevelDialog,
  1964.             kHiLevelItem_SourceScale2,
  1965.             &data.sourceScale2,
  1966.             &data.sourceScaleRange))
  1967.     {
  1968.         badItem = kHiLevelItem_SourceScale2;
  1969.         goto bail;
  1970.     }
  1971.     
  1972.     if (!Utils_GetVector3DField(
  1973.             gTestHiLevelDialog,
  1974.             kHiLevelItem_SourcePosition1,
  1975.             &data.sourcePosition1,
  1976.             NULL))
  1977.     {
  1978.         badItem = kHiLevelItem_SourcePosition1;
  1979.         goto bail;
  1980.     }
  1981.     
  1982.     if (!Utils_GetVector3DField(
  1983.             gTestHiLevelDialog,
  1984.             kHiLevelItem_SourcePosition2,
  1985.             &data.sourcePosition2,
  1986.             &data.sourcePositionRange))
  1987.     {
  1988.         badItem = kHiLevelItem_SourcePosition2;
  1989.         goto bail;
  1990.     }
  1991.     
  1992.     if (!Utils_GetVector3DField(
  1993.             gTestHiLevelDialog,
  1994.             kHiLevelItem_SourceOrientation1,
  1995.             &data.sourceOrientation1,
  1996.             NULL))
  1997.     {
  1998.         badItem = kHiLevelItem_SourceOrientation1;
  1999.         goto bail;
  2000.     }
  2001.     
  2002.     if (!Utils_GetVector3DField(
  2003.             gTestHiLevelDialog,
  2004.             kHiLevelItem_SourceOrientation2,
  2005.             &data.sourceOrientation2,
  2006.             &data.sourceOrientationRange))
  2007.     {
  2008.         badItem = kHiLevelItem_SourceOrientation2;
  2009.         goto bail;
  2010.     }
  2011.     
  2012.     if (!Utils_GetVector3DField(
  2013.             gTestHiLevelDialog,
  2014.             kHiLevelItem_SourceUpVector1,
  2015.             &data.sourceUpVector1,
  2016.             NULL))
  2017.     {
  2018.         badItem = kHiLevelItem_SourceUpVector1;
  2019.         goto bail;
  2020.     }
  2021.     
  2022.     if (!Utils_GetVector3DField(
  2023.             gTestHiLevelDialog,
  2024.             kHiLevelItem_SourceUpVector2,
  2025.             &data.sourceUpVector2,
  2026.             &data.sourceUpVectorRange))
  2027.     {
  2028.         badItem = kHiLevelItem_SourceUpVector2;
  2029.         goto bail;
  2030.     }
  2031.     
  2032.     if (!Utils_GetVector3DField(
  2033.             gTestHiLevelDialog,
  2034.             kHiLevelItem_SourceVelocity1,
  2035.             &data.sourceVelocity1,
  2036.             NULL))
  2037.     {
  2038.         badItem = kHiLevelItem_SourceVelocity1;
  2039.         goto bail;
  2040.     }
  2041.     
  2042.     if (!Utils_GetVector3DField(
  2043.             gTestHiLevelDialog,
  2044.             kHiLevelItem_SourceVelocity2,
  2045.             &data.sourceVelocity2,
  2046.             &data.sourceVelocityRange))
  2047.     {
  2048.         badItem = kHiLevelItem_SourceVelocity2;
  2049.         goto bail;
  2050.     }
  2051.     
  2052.     GetDialogItem(gTestHiLevelDialog, kHiLevelItem_SourceMode, &itemType, &itemHandle, &itemBounds);
  2053.     switch (GetControlValue((ControlHandle) itemHandle))
  2054.     {
  2055.         case kSourceModeItem_Unfiltered:
  2056.             data.sourceMode = kSSpSourceMode_Unfiltered;
  2057.         break;
  2058.         
  2059.         case kSourceModeItem_Localized:
  2060.             data.sourceMode = kSSpSourceMode_Localized;
  2061.         break;
  2062.         
  2063.         case kSourceModeItem_Ambient:
  2064.             data.sourceMode = kSSpSourceMode_Ambient;
  2065.         break;
  2066.         
  2067.         case kSourceModeItem_Binaural:
  2068.             data.sourceMode = kSSpSourceMode_Binaural;
  2069.         break;
  2070.         
  2071.         default:
  2072.             assert(0);
  2073.     }
  2074.     
  2075.     if (!Utils_GetFloatField(
  2076.             gTestHiLevelDialog,
  2077.             kHiLevelItem_ReferenceDistance1,
  2078.             &data.referenceDistance1,
  2079.             NULL,
  2080.             small,
  2081.             big))
  2082.     {
  2083.         badItem = kHiLevelItem_ReferenceDistance1;
  2084.         goto bail;
  2085.     }
  2086.     
  2087.     if (!Utils_GetFloatField(
  2088.             gTestHiLevelDialog,
  2089.             kHiLevelItem_ReferenceDistance2,
  2090.             &data.referenceDistance2,
  2091.             &data.referenceDistanceRange,
  2092.             small,
  2093.             big))
  2094.     {
  2095.         badItem = kHiLevelItem_ReferenceDistance2;
  2096.         goto bail;
  2097.     }
  2098.     
  2099.     if (!Utils_GetFloatField(
  2100.             gTestHiLevelDialog,
  2101.             kHiLevelItem_Length1,
  2102.             &data.length1,
  2103.             NULL,
  2104.             -big,
  2105.             0.0))
  2106.     {
  2107.         badItem = kHiLevelItem_Length1;
  2108.         goto bail;
  2109.     }
  2110.     
  2111.     if (!Utils_GetFloatField(
  2112.             gTestHiLevelDialog,
  2113.             kHiLevelItem_Length2,
  2114.             &data.length2,
  2115.             &data.lengthRange,
  2116.             0.0,
  2117.             big))
  2118.     {
  2119.         badItem = kHiLevelItem_Length2;
  2120.         goto bail;
  2121.     }
  2122.     
  2123.     if (!Utils_GetFloatField(
  2124.             gTestHiLevelDialog,
  2125.             kHiLevelItem_Width1,
  2126.             &data.width1,
  2127.             NULL,
  2128.             0.0,
  2129.             big))
  2130.     {
  2131.         badItem = kHiLevelItem_Width1;
  2132.         goto bail;
  2133.     }
  2134.     
  2135.     if (!Utils_GetFloatField(
  2136.             gTestHiLevelDialog,
  2137.             kHiLevelItem_Width2,
  2138.             &data.width2,
  2139.             &data.widthRange,
  2140.             0.0,
  2141.             big))
  2142.     {
  2143.         badItem = kHiLevelItem_Width2;
  2144.         goto bail;
  2145.     }
  2146.     
  2147.     if (!Utils_GetFloatField(
  2148.             gTestHiLevelDialog,
  2149.             kHiLevelItem_Height1,
  2150.             &data.height1,
  2151.             NULL,
  2152.             0.0,
  2153.             big))
  2154.     {
  2155.         badItem = kHiLevelItem_Height1;
  2156.         goto bail;
  2157.     }
  2158.     
  2159.     if (!Utils_GetFloatField(
  2160.             gTestHiLevelDialog,
  2161.             kHiLevelItem_Height2,
  2162.             &data.height2,
  2163.             &data.heightRange,
  2164.             0.0,
  2165.             big))
  2166.     {
  2167.         badItem = kHiLevelItem_Height2;
  2168.         goto bail;
  2169.     }
  2170.     
  2171.     if (!Utils_GetFloatField(
  2172.             gTestHiLevelDialog,
  2173.             kHiLevelItem_ConeAngleDeg1,
  2174.             &data.coneAngleDeg1,
  2175.             NULL,
  2176.             0.0,
  2177.             360.0))
  2178.     {
  2179.         badItem = kHiLevelItem_ConeAngleDeg1;
  2180.         goto bail;
  2181.     }
  2182.     
  2183.     if (!Utils_GetFloatField(
  2184.             gTestHiLevelDialog,
  2185.             kHiLevelItem_ConeAngleDeg2,
  2186.             &data.coneAngleDeg2,
  2187.             &data.coneAngleDegRange,
  2188.             0.0,
  2189.             360.0))
  2190.     {
  2191.         badItem = kHiLevelItem_ConeAngleDeg2;
  2192.         goto bail;
  2193.     }
  2194.     
  2195.     if (!Utils_GetFloatField(
  2196.             gTestHiLevelDialog,
  2197.             kHiLevelItem_ConeAttenuation1,
  2198.             &data.coneAttenuation1,
  2199.             NULL,
  2200.             -big,
  2201.             big))
  2202.     {
  2203.         badItem = kHiLevelItem_ConeAttenuation1;
  2204.         goto bail;
  2205.     }
  2206.     
  2207.     if (!Utils_GetFloatField(
  2208.             gTestHiLevelDialog,
  2209.             kHiLevelItem_ConeAttenuation2,
  2210.             &data.coneAttenuation2,
  2211.             &data.coneAttenuationRange,
  2212.             -big,
  2213.             big))
  2214.     {
  2215.         badItem = kHiLevelItem_ConeAttenuation2;
  2216.         goto bail;
  2217.     }
  2218.     
  2219.     // All fields are good -- finish up
  2220.     gTestHiLevelData = data;
  2221.     TestHiLevel_DeriveData();
  2222.     
  2223.     TestHiLevel_SetDialogFields();
  2224.     
  2225.     gTestHiLevelUpdate = true;
  2226.     
  2227.     return;
  2228.     
  2229.     // Error exit
  2230. bail:
  2231.     SelectDialogItemText(gTestHiLevelDialog, badItem, 0, 32767);
  2232.     StopAlert(kAlrtID_BadField, NULL);
  2233. }
  2234.  
  2235.  
  2236. /* =============================================================================
  2237.  *        TestHiLevel_Preset (external)
  2238.  *
  2239.  *    Updates the fields to the chosen preset value.
  2240.  * ========================================================================== */
  2241. void TestHiLevel_Preset(
  2242.     UInt32            index)
  2243. {
  2244.     TTestHiLevelData preset[] = {
  2245.         { /* nothing for index zero */ },
  2246.         { /* Left-Right Ahead */
  2247.                 /* duration                    */    4.0,
  2248.                 /* listenerTranslate        */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2249.                 /* listenerRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2250.                 /* listenerRotationAngle    */    0.0, 0.0, false,
  2251.                 /* listenerScale            */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2252.                 /* listenerPosition            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2253.                 /* listenerOrientation        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2254.                 /* listenerUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2255.                 /* listenerVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2256.                 /* medium                    */    kSSpMedium_Air,
  2257.                 /* humidity                    */    0.0, 0.0, false,
  2258.                 /* roomSize                    */    0.0, 0.0, false,
  2259.                 /* roomReflectivity            */    -10.0, 0.0, false,
  2260.                 /* reverbAttenuation        */    -15.0, 0.0, false,
  2261.                 /* cpuLoad                    */    0, 0, false,
  2262.                 /* sourceTranslate            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2263.                 /* sourceRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2264.                 /* sourceRotationAngle        */    0.0, 0.0, false,
  2265.                 /* sourceScale                */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2266.                 /* sourcePosition            */    {1.0, 0.0, -10.0}, {1.0, 0.0, 10.0}, true,
  2267.                 /* sourceOrientation        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2268.                 /* sourceUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2269.                 /* sourceVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2270.                 /* medium                    */    kSSpSourceMode_Localized,
  2271.                 /* referenceDistance        */    1.0, 0.0, false,
  2272.                 /* length                    */    0.0, 0.0, false,
  2273.                 /* width                    */    0.0, 0.0, false,
  2274.                 /* height                    */    0.0, 0.0, false,
  2275.                 /* coneAngleDeg                */    0.0, 0.0, false,
  2276.                 /* coneAttenuation            */    0.0, 0.0, false
  2277.         },
  2278.         { /* Front-Back Above */
  2279.                 /* duration                    */    4.0,
  2280.                 /* listenerTranslate        */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2281.                 /* listenerRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2282.                 /* listenerRotationAngle    */    0.0, 0.0, false,
  2283.                 /* listenerScale            */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2284.                 /* listenerPosition            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2285.                 /* listenerOrientation        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2286.                 /* listenerUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2287.                 /* listenerVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2288.                 /* medium                    */    kSSpMedium_Air,
  2289.                 /* humidity                    */    0.0, 0.0, false,
  2290.                 /* roomSize                    */    0.0, 0.0, false,
  2291.                 /* roomReflectivity            */    -10.0, 0.0, false,
  2292.                 /* reverbAttenuation        */    -15.0, 0.0, false,
  2293.                 /* cpuLoad                    */    0, 0, false,
  2294.                 /* sourceTranslate            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2295.                 /* sourceRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2296.                 /* sourceRotationAngle        */    0.0, 0.0, false,
  2297.                 /* sourceScale                */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2298.                 /* sourcePosition            */    {10.0, 1.0, 0.0}, {-10.0, 1.0, 0.0}, true,
  2299.                 /* sourceOrientation        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2300.                 /* sourceUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2301.                 /* sourceVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2302.                 /* medium                    */    kSSpSourceMode_Localized,
  2303.                 /* referenceDistance        */    1.0, 0.0, false,
  2304.                 /* length                    */    0.0, 0.0, false,
  2305.                 /* width                    */    0.0, 0.0, false,
  2306.                 /* height                    */    0.0, 0.0, false,
  2307.                 /* coneAngleDeg                */    0.0, 0.0, false,
  2308.                 /* coneAttenuation            */    0.0, 0.0, false
  2309.         },
  2310.         { /* Up-Down Ahead */
  2311.                 /* duration                    */    4.0,
  2312.                 /* listenerTranslate        */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2313.                 /* listenerRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2314.                 /* listenerRotationAngle    */    0.0, 0.0, false,
  2315.                 /* listenerScale            */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2316.                 /* listenerPosition            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2317.                 /* listenerOrientation        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2318.                 /* listenerUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2319.                 /* listenerVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2320.                 /* medium                    */    kSSpMedium_Air,
  2321.                 /* humidity                    */    0.0, 0.0, false,
  2322.                 /* roomSize                    */    0.0, 0.0, false,
  2323.                 /* roomReflectivity            */    -10.0, 0.0, false,
  2324.                 /* reverbAttenuation        */    -15.0, 0.0, false,
  2325.                 /* cpuLoad                    */    0, 0, false,
  2326.                 /* sourceTranslate            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2327.                 /* sourceRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2328.                 /* sourceRotationAngle        */    0.0, 0.0, false,
  2329.                 /* sourceScale                */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2330.                 /* sourcePosition            */    {1.0, -10.0, 0.0}, {1.0, 10.0, 0.0}, true,
  2331.                 /* sourceOrientation        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2332.                 /* sourceUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2333.                 /* sourceVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2334.                 /* medium                    */    kSSpSourceMode_Localized,
  2335.                 /* referenceDistance        */    1.0, 0.0, false,
  2336.                 /* length                    */    0.0, 0.0, false,
  2337.                 /* width                    */    0.0, 0.0, false,
  2338.                 /* height                    */    0.0, 0.0, false,
  2339.                 /* coneAngleDeg                */    0.0, 0.0, false,
  2340.                 /* coneAttenuation            */    0.0, 0.0, false
  2341.         },
  2342.         { /* dividing line */ },
  2343.         { /* Reverb — Living Room */
  2344.                 /* duration                    */    4.0,
  2345.                 /* listenerTranslate        */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2346.                 /* listenerRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2347.                 /* listenerRotationAngle    */    0.0, 0.0, false,
  2348.                 /* listenerScale            */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2349.                 /* listenerPosition            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2350.                 /* listenerOrientation        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2351.                 /* listenerUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2352.                 /* listenerVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2353.                 /* medium                    */    kSSpMedium_Air,
  2354.                 /* humidity                    */    0.0, 0.0, false,
  2355.                 /* roomSize                    */    10.0, 0.0, false,
  2356.                 /* roomReflectivity            */    -20.0, 0.0, false,
  2357.                 /* reverbAttenuation        */    0.0, 0.0, false,
  2358.                 /* cpuLoad                    */    0, 0, false,
  2359.                 /* sourceTranslate            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2360.                 /* sourceRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2361.                 /* sourceRotationAngle        */    0.0, 0.0, false,
  2362.                 /* sourceScale                */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2363.                 /* sourcePosition            */    {2.0, 0.0, 0.0}, {10.0, 0.0, 0.0}, true,
  2364.                 /* sourceOrientation        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2365.                 /* sourceUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2366.                 /* sourceVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2367.                 /* medium                    */    kSSpSourceMode_Localized,
  2368.                 /* referenceDistance        */    1.0, 0.0, false,
  2369.                 /* length                    */    0.0, 0.0, false,
  2370.                 /* width                    */    0.0, 0.0, false,
  2371.                 /* height                    */    0.0, 0.0, false,
  2372.                 /* coneAngleDeg                */    0.0, 0.0, false,
  2373.                 /* coneAttenuation            */    0.0, 0.0, false
  2374.         },
  2375.         { /* Reverb — Cave */
  2376.                 /* duration                    */    4.0,
  2377.                 /* listenerTranslate        */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2378.                 /* listenerRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2379.                 /* listenerRotationAngle    */    0.0, 0.0, false,
  2380.                 /* listenerScale            */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2381.                 /* listenerPosition            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2382.                 /* listenerOrientation        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2383.                 /* listenerUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2384.                 /* listenerVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2385.                 /* medium                    */    kSSpMedium_Air,
  2386.                 /* humidity                    */    0.0, 0.0, false,
  2387.                 /* roomSize                    */    100.0, 0.0, false,
  2388.                 /* roomReflectivity            */    -40.0, 0.0, false,
  2389.                 /* reverbAttenuation        */    20.0, 0.0, false,
  2390.                 /* cpuLoad                    */    0, 0, false,
  2391.                 /* sourceTranslate            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2392.                 /* sourceRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2393.                 /* sourceRotationAngle        */    0.0, 0.0, false,
  2394.                 /* sourceScale                */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2395.                 /* sourcePosition            */    {2.0, 0.0, 0.0}, {10.0, 0.0, 0.0}, true,
  2396.                 /* sourceOrientation        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2397.                 /* sourceUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2398.                 /* sourceVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2399.                 /* medium                    */    kSSpSourceMode_Localized,
  2400.                 /* referenceDistance        */    1.0, 0.0, false,
  2401.                 /* length                    */    0.0, 0.0, false,
  2402.                 /* width                    */    0.0, 0.0, false,
  2403.                 /* height                    */    0.0, 0.0, false,
  2404.                 /* coneAngleDeg                */    0.0, 0.0, false,
  2405.                 /* coneAttenuation            */    0.0, 0.0, false
  2406.         },
  2407.         { /* Reverb — Stadium */
  2408.                 /* duration                    */    4.0,
  2409.                 /* listenerTranslate        */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2410.                 /* listenerRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2411.                 /* listenerRotationAngle    */    0.0, 0.0, false,
  2412.                 /* listenerScale            */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2413.                 /* listenerPosition            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2414.                 /* listenerOrientation        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2415.                 /* listenerUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2416.                 /* listenerVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2417.                 /* medium                    */    kSSpMedium_Air,
  2418.                 /* humidity                    */    0.0, 0.0, false,
  2419.                 /* roomSize                    */    250.0, 0.0, false,
  2420.                 /* roomReflectivity            */    -15.0, 0.0, false,
  2421.                 /* reverbAttenuation        */    -5.0, 0.0, false,
  2422.                 /* cpuLoad                    */    0, 0, false,
  2423.                 /* sourceTranslate            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2424.                 /* sourceRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2425.                 /* sourceRotationAngle        */    0.0, 0.0, false,
  2426.                 /* sourceScale                */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2427.                 /* sourcePosition            */    {2.0, 0.0, 0.0}, {10.0, 0.0, 0.0}, true,
  2428.                 /* sourceOrientation        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2429.                 /* sourceUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2430.                 /* sourceVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2431.                 /* medium                    */    kSSpSourceMode_Localized,
  2432.                 /* referenceDistance        */    1.0, 0.0, false,
  2433.                 /* length                    */    0.0, 0.0, false,
  2434.                 /* width                    */    0.0, 0.0, false,
  2435.                 /* height                    */    0.0, 0.0, false,
  2436.                 /* coneAngleDeg                */    0.0, 0.0, false,
  2437.                 /* coneAttenuation            */    0.0, 0.0, false
  2438.         },
  2439.         { /* dividing line */ },
  2440.         { /* Searchlight */
  2441.                 /* duration                    */    4.0,
  2442.                 /* listenerTranslate        */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2443.                 /* listenerRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2444.                 /* listenerRotationAngle    */    0.0, 0.0, false,
  2445.                 /* listenerScale            */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2446.                 /* listenerPosition            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2447.                 /* listenerOrientation        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2448.                 /* listenerUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2449.                 /* listenerVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2450.                 /* medium                    */    kSSpMedium_Air,
  2451.                 /* humidity                    */    0.0, 0.0, false,
  2452.                 /* roomSize                    */    0.0, 0.0, false,
  2453.                 /* roomReflectivity            */    -10.0, 0.0, false,
  2454.                 /* reverbAttenuation        */    -15.0, 0.0, false,
  2455.                 /* cpuLoad                    */    0, 0, false,
  2456.                 /* sourceTranslate            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2457.                 /* sourceRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2458.                 /* sourceRotationAngle        */    0.0, 0.0, false,
  2459.                 /* sourceScale                */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2460.                 /* sourcePosition            */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2461.                 /* sourceOrientation        */    {-0.1, 0.0, -1.0}, {-0.1, 0.0, 1.0}, true,
  2462.                 /* sourceUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2463.                 /* sourceVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2464.                 /* medium                    */    kSSpSourceMode_Localized,
  2465.                 /* referenceDistance        */    1.0, 0.0, false,
  2466.                 /* length                    */    0.0, 0.0, false,
  2467.                 /* width                    */    0.0, 0.0, false,
  2468.                 /* height                    */    0.0, 0.0, false,
  2469.                 /* coneAngleDeg                */    180.0, 0.0, false,
  2470.                 /* coneAttenuation            */    -20.0, 0.0, false
  2471.         },
  2472.         { /* dividing line */ },
  2473.         { /* Box Left-Right Ahead */
  2474.                 /* duration                    */    4.0,
  2475.                 /* listenerTranslate        */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2476.                 /* listenerRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2477.                 /* listenerRotationAngle    */    0.0, 0.0, false,
  2478.                 /* listenerScale            */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2479.                 /* listenerPosition            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2480.                 /* listenerOrientation        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2481.                 /* listenerUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2482.                 /* listenerVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2483.                 /* medium                    */    kSSpMedium_Air,
  2484.                 /* humidity                    */    0.0, 0.0, false,
  2485.                 /* roomSize                    */    0.0, 0.0, false,
  2486.                 /* roomReflectivity            */    -10.0, 0.0, false,
  2487.                 /* reverbAttenuation        */    -15.0, 0.0, false,
  2488.                 /* cpuLoad                    */    0, 0, false,
  2489.                 /* sourceTranslate            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2490.                 /* sourceRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2491.                 /* sourceRotationAngle        */    0.0, 0.0, false,
  2492.                 /* sourceScale                */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2493.                 /* sourcePosition            */    {2.0, 0.0, -10.0}, {2.0, 0.0, 10.0}, true,
  2494.                 /* sourceOrientation        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2495.                 /* sourceUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2496.                 /* sourceVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2497.                 /* medium                    */    kSSpSourceMode_Localized,
  2498.                 /* referenceDistance        */    1.0, 0.0, false,
  2499.                 /* length                    */    1.0, 0.0, false,
  2500.                 /* width                    */    1.0, 0.0, false,
  2501.                 /* height                    */    1.0, 0.0, false,
  2502.                 /* coneAngleDeg                */    0.0, 0.0, false,
  2503.                 /* coneAttenuation            */    0.0, 0.0, false
  2504.         },
  2505.     };
  2506.     
  2507.     gTestHiLevelData = preset[index];
  2508.     
  2509.     TestHiLevel_DeriveData();
  2510.     TestHiLevel_SetDialogFields();
  2511.     
  2512.     gTestHiLevelUpdate = true;
  2513. }
  2514.  
  2515.  
  2516.